#include <REGX52.H>

sbit Onewire_DQ=P3^7;//把DS18B20的接口重新定义一个新名字

unsigned char Onewire_Init(void)//单总线时序初始化
{
	unsigned char i;
	unsigned char AckBit;
	Onewire_DQ=1;
	Onewire_DQ=0;
	
	i = 247;
	while (--i);//延时500us
	Onewire_DQ=1;//总线释放
	
	i = 32;
	while (--i);//延时70us,从机会主动拉低总线
	
	AckBit=Onewire_DQ;
	i = 247;
	while (--i);//延时500us，结束初始化过程
	return AckBit;
}

void Onewire_SendBit(unsigned char Bit)//发送一位数据
{
	unsigned char i;
	Onewire_DQ=0;//主机先将总线拉低,从而判断发送1还是0
	i = 4;while (--i);//延时10us左右
	Onewire_DQ=Bit;//将Bit（就是主机或者是我们想要发送的值给从机，若Bit=1，总线被拉高，从机读取的时候就是1，
	i = 24;while (--i);//延时50us左右
	Onewire_DQ=1;
	
}


unsigned char Onewire_ReceiveBit(void)//接收一位数据
{
	unsigned char i;
	unsigned char Bit;
	Onewire_DQ=0;//主机先将总线拉低
	i = 2;while (--i);//延时大约5us
	Onewire_DQ=1;//释放总线
	i = 2;while (--i);//延时大约5us
	Bit=Onewire_DQ;//采样，将端口的值赋给Bit，就是读取总线电平
	i = 24;while (--i);//延时50us左右
	return Bit;
	//接收后，从机会自动释放总线
}

void Onewire_SendByte(unsigned char Byte)//发送一个字节
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		Onewire_SendBit(Byte&(0x01<<i));//字节与0x01左移数相与，就能从右往左取出字节的每一位
	}
}

unsigned char Onewire_ReceiveByte(void)//接收一个字节
{
	
		unsigned char i;
	unsigned char Byte=0x00;//将Byte赋初值为0x00
	for(i=0;i<8;i++)
	{
		if(Onewire_ReceiveBit())//如果接收一位的函数为真，Byte就与0x01左移对应的数或运算
		{
			Byte|=(0x01<<i);
			
		}
	}
	return Byte;
}
